/*
 * Cherry programming language
 * Copyright (C) 2013 Christoph Mueller
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

#include <crystal/unittest.h>
#include <cherry/parser.h>
#include <stdio.h>
#include <string.h>

static void test_lex_fixnum(const_pointer data)
{
    byte_t* fixnum = "0 0xFF 0xFF_FF 1_000 0777 0b0001 0b0001_1111";
    struct CyContext* c = cy_context_repl_new(fixnum);

	assert(cy_lex(c) == TOK_DEC);
	assert(strcmp(cy_token_string(c), "0") == 0);

	assert(cy_lex(c) == TOK_HEX);
	assert(strcmp(cy_token_string(c), "0xFF") == 0);

	assert(cy_lex(c) == TOK_HEX);
	assert(strcmp(cy_token_string(c), "0xFFFF") == 0);

	assert(cy_lex(c) == TOK_DEC);
	assert(strcmp(cy_token_string(c), "1000") == 0);

	assert(cy_lex(c) == TOK_OCT);
	assert(strcmp(cy_token_string(c), "0777") == 0);

	assert(cy_lex(c) == TOK_BIN);
	assert(strcmp(cy_token_string(c), "0b0001") == 0);

	assert(cy_lex(c) == TOK_BIN);
	assert(strcmp(cy_token_string(c), "0b00011111") == 0);

	cy_context_free(c);
}


static void test_lex_float(const_pointer data)
{
    byte_t* fixnum = "1.0 4e+1 5e-10 1.0e20";
    struct CyContext* c = cy_context_repl_new(fixnum);

	assert(cy_lex(c) == TOK_FLOAT);
	assert(strcmp(cy_token_string(c), "1.0") == 0);
	
	assert(cy_lex(c) == TOK_FLOAT);
	assert(strcmp(cy_token_string(c), "4e+1") == 0);
	
	assert(cy_lex(c) == TOK_FLOAT);
	assert(strcmp(cy_token_string(c), "5e-10") == 0);
	
	assert(cy_lex(c) == TOK_FLOAT);
	assert(strcmp(cy_token_string(c), "1.0e20") == 0);
	
	cy_context_free(c);
}


void test_suite_lex()
{
    cry_unittest_run("org.cherry.parser/lex_fixnum", test_lex_fixnum, 0, 100);
    cry_unittest_run("org.cherry.parser/lex_float", test_lex_float, 0, 100);
}



